/**
 * n8n 本地节点内省工具集
 * 
 * 通过读取本地安装的 n8n-nodes-base 包来获取节点信息
 * 解决大模型使用过时节点信息的问题
 */

import { createTool, field } from '../../core/tool-schema.js';
import type { ToolPackage } from '../../core/tool-registry.js';
import N8nNodeIntrospection from '../node-introspection.js';

// 创建内省服务实例
const nodeIntrospection = new N8nNodeIntrospection();

// ========== 本地节点信息工具 ==========

const listLocalNodeTypes = createTool()
  .name('n8n_list_local_node_types')
  .title('列出本地节点类型')
  .description('从本地安装的n8n-nodes-base包中获取所有可用的节点类型列表，确保信息是最新的')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('n8n节点内省')
  .tags(['n8n', 'node', 'introspection', 'local'])
  .parameter(
    'category',
    field.optional(
      field.string({
        description: '过滤特定类别的节点（如：cloud, communication, core等）',
      })
    )
  )
  .parameter(
    'search',
    field.optional(
      field.string({
        description: '按名称搜索节点（支持模糊匹配）',
      })
    )
  )
  .build(async (params = {}) => {
    try {
      const result = await nodeIntrospection.listNodeTypes({
        category: params.category,
        search: params.search,
      });

      return {
        success: true,
        data: result,
        message: `找到 ${result.total} 个节点类型`,
      };
    } catch (error) {
      return {
        success: false,
        error: error instanceof Error ? error.message : '获取本地节点类型失败',
      };
    }
  });

const getLocalNodeDetails = createTool()
  .name('n8n_get_local_node_details')
  .title('获取本地节点详情')
  .description('从本地安装的n8n-nodes-base包中获取特定节点的详细信息，包括属性定义、输入输出等完整schema')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('n8n节点内省')
  .tags(['n8n', 'node', 'introspection', 'local', 'details'])
  .parameter(
    'nodeType',
    field.required(
      field.string({
        description: '节点类型名称（如：ActionNetwork, PostBin等）',
      })
    )
  )
  .build(async (params) => {
    try {
      const result = await nodeIntrospection.getNodeDetails(params.nodeType);
      
      if (!result) {
        return {
          success: false,
          error: `未找到节点类型: ${params.nodeType}`,
          message: '请检查节点类型名称是否正确，或先使用 n8n_list_local_node_types 查看可用的节点类型',
        };
      }

      return {
        success: true,
        data: result,
        message: `成功获取节点 ${params.nodeType} 的详细信息`,
      };
    } catch (error) {
      return {
        success: false,
        error: error instanceof Error ? error.message : '获取本地节点详情失败',
      };
    }
  });

const clearNodeCache = createTool()
  .name('n8n_clear_node_cache')
  .title('清空节点缓存')
  .description('清空本地节点信息缓存，强制重新加载最新的节点信息')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('n8n节点内省')
  .tags(['n8n', 'node', 'introspection', 'cache'])
  .build(async (params = {}) => {
    try {
      nodeIntrospection.clearCache();
      return {
        success: true,
        message: '节点信息缓存已清空',
      };
    } catch (error) {
      return {
        success: false,
        error: error instanceof Error ? error.message : '清空缓存失败',
      };
    }
  });

const clearNodeMetadata = createTool()
  .name('n8n_clear_node_metadata')
  .title('清除节点元数据')
  .description('删除预生成的节点元数据文件，下次启动时将重新生成。适用于n8n版本更新后刷新节点信息')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('n8n节点内省')
  .tags(['n8n', 'node', 'introspection', 'metadata', 'update'])
  .build(async (params = {}) => {
    try {
      await nodeIntrospection.clearMetadata();
      return {
        success: true,
        message: '节点元数据已清除，下次启动时将重新生成',
      };
    } catch (error) {
      return {
        success: false,
        error: error instanceof Error ? error.message : '清除元数据失败',
      };
    }
  });

// ========== 工具导出 ==========

export const tools = [
  listLocalNodeTypes,
  getLocalNodeDetails,
  clearNodeCache,
  clearNodeMetadata,
];

// 导出元数据
export const meta = {
  name: 'n8n-node-introspection',
  version: '1.0.0',
  description: 'n8n 本地节点内省工具集，从本地安装包直接读取最新的节点信息',
  author: 'Test Case Writer Team',
};

// 默认导出
const toolPackage: ToolPackage = {
  tools,
  meta,
};

export default toolPackage;
